home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 52
/
Aminet 52 (2002)(GTI - Schatztruhe)[!][Dec 2002].iso
/
Aminet
/
misc
/
emu
/
Apex-src.lha
/
RLIO.XPL
< prev
next >
Wrap
Text File
|
2001-09-30
|
6KB
|
239 lines
\RLIO.XPL APR-08-89
\Real input/output routines
code \Complete set of INTM.68K intrinsics
ABS= 0, RAN= 1, REM= 2, RESERVE= 3,
SWAP= 4, EXTEND= 5, RESTART= 6, CHIN= 7,
CHOUT= 8, CRLF= 9, INTIN= 10, INTOUT= 11,
TEXT= 12, OPENI= 13, OPENO= 14, CLOSE= 15,
ABORT= 16, TRAP= 17, FREE= 18, RERUN= 19,
GETHP= 20, SETHP= 21, GETERR= 22, CURSOR= 23,
SCAN= 24, SETRUN= 25, HEXIN= 26, HEXOUT= 27,
CHAIN= 28, OPENF= 29, WRITE= 30, READ= 31,
TESTPT= 32, FGET= 33, FSAVE= 35,
BLIT= 36, BUTTON= 37, MOUSE= 38, SOUND= 39,
CLEAR= 40, POINT= 41, LINE= 42, MOVE= 43,
SCREEN= 44, BLOCK= 45, FIX= 50, BACKUP= 64,
SETBUF= 107,
BITMAP= 108, BITMAP2= 109, VIEW= 110, PALETTE= 111,
CARRY= 112, PEEK_W= 113, POKE_W= 114, PEEK_L= 115,
POKE_L= 116, SWAP_W= 117, EXT_L= 118, CURSOR1= 119,
BUTES1= 120, SHOCUR1= 121, DEVINFO= 122, UNTINFO= 123,
BUTES= 124, GETKEY= 125, KEYHIT= 126, SHOCUR= 127;
code real RLRES= 46, \RLIN= 47,\ \RLOUT= 48,\
FLOAT= 49, RLABS= 51, \FORMAT= 52,\ SQRT= 53,
LN= 54, EXP= 55, SIN= 56, \ATAN2= 57,\
\MOD= 58,\ LOG= 59, COS= 60, TAN= 61,
ASIN= 62, ACOS= 63, ATAN= 68;
link proc FORMAT(MDIGIT, NDIGIT); \Set format parameters for RLOUT
int MDIGIT, NDIGIT;
addr ADDR;
begin
ADDR:= $7FE;
ADDR(0):= MDIGIT;
ADDR(1):= NDIGIT;
end; \FORMAT
\----------------------------------------------------------------------
link proc RLOUT(DEV, X);
\Output the real number X to the specified device.
\Other inputs: MDIGIT, NDIGIT.
int DEV;
real X;
int MDIGIT, NDIGIT, M, NEG, EXP;
addr ADDR;
real ZERO, ONE, TEN, KILO;
proc RLOUTX(DEV, X);
\Output the real number X to the specified device.
\Other inputs: M, NDIGIT.
int DEV;
real X;
real SX, RND, HALF, ONE, TEN;
int I, K, L, NEG;
def SIGFIGS =15; \Maximum number of decimal digits
proc DIGITOUT;
int DIGIT;
begin
for I:= 1, K do
begin
if L > 0 then
begin
X:= X *TEN;
DIGIT:= FIX(X -HALF);
CHOUT(DEV, DIGIT +^0);
X:= X -FLOAT(DIGIT);
L:= L -1;
end
else CHOUT(DEV,^0);
end;
end; \DIGITOUT
begin \RLOUTX
TEN:= FLOAT(10);
ONE:= FLOAT(1);
HALF:= ONE /FLOAT(2);
if X < FLOAT(0) then [X:= -X; NEG:= true] else NEG:= false;
K:= 0;
SX:= X; \Save original number to determine leading zero
if X # FLOAT(0) then
begin
while X >= ONE do [X:= X /TEN; K:= K +1];
\Add in rounding factor: 0.5 * 10 ^ -(K+NDIGIT)
RND:= HALF;
L:= K +NDIGIT;
if L > SIGFIGS then L:= SIGFIGS;
for I:= 1, L do RND:= RND /TEN;
X:= X +RND;
if X >= ONE then
[X:= X /TEN; K:= K +1; \Adjust for round overflow
SX:= TEN]; \Forget about leading zero
end;
\Calculate the number of leading blanks needed:
L:= M -K;
if SX < ONE then L:= L-1; \Leave room for leading zero
for I:= 1, L do CHOUT(DEV,^ );
CHOUT(DEV, if NEG then ^- else ^ );
if SX < ONE then CHOUT(DEV,^0); \Output leading zero, E.G: 0.2
L:= SIGFIGS;
DIGITOUT; \Output digits in front of the D.P.
if NDIGIT > 0 then \Output digits after D.P.
[CHOUT(DEV, ^.); K:= NDIGIT; DIGITOUT];
end; \RLOUTX
proc EXPOUT;
begin
if NEG then X:= -X;
RLOUTX(DEV, X);
CHOUT(DEV, ^E);
CHOUT(DEV, if EXP < 0 then ^- else ^+);
EXP:= ABS(EXP);
if EXP < 10 then CHOUT(DEV, ^0);
INTOUT(DEV, EXP);
end; \EXPOUT
begin \RLOUT
ADDR:= $7FE;
MDIGIT:= EXTEND(ADDR(0));
NDIGIT:= ADDR(1);
if MDIGIT >= 1 then [M:= MDIGIT; RLOUTX(DEV, X); return];
ZERO:= FLOAT(0);
ONE:= FLOAT(1);
TEN:= FLOAT(10);
KILO:= FLOAT(1000);
if X < ZERO then [X:= -X; NEG:= true] else NEG:= false;
EXP:= 0;
if MDIGIT = 0 then \Scientific notation
begin \E.G: 1.2E+23, 1.2E-102, 1.2E+02
M:= 2;
if X # ZERO then
begin
while X < ONE do [X:= X *TEN; EXP:= EXP -1];
while X >= TEN do [X:= X /TEN; EXP:= EXP +1];
end;
EXPOUT;
end
else begin \Engineering notation
M:= 4;
if X # ZERO then
begin
while X < ONE do [X:= X *KILO; EXP:= EXP -3];
while X >= KILO do [X:= X /KILO; EXP:= EXP +3];
end;
EXPOUT;
end;
end; \RLOUT
\----------------------------------------------------------------------
link func real RLIN(DEV);
\Read in the ASCII representation of a real number from the specified device
\ and return its value.
int DEV; \Input device
int CH, \Character
EX, \Power-of-ten exponent, total effective value
N, \Exponent as specified by input
NEG, \Flag: Negative real number
ENEG, \Flag: Negative exponent
DIGIT; \Flag: Last character is a digit (0 thru 9)
real X, \Value of real number
TEN; \1.0, Avoids use of real constants which are not as easily
\ ported from one floating point representation to another.
proc GETCH; \Get character from input device
begin
CH:= CHIN(DEV);
DIGIT:= CH>=^0 & CH<=^9; \Is it a digit?
end; \GETCH
proc ADDIN;
begin
X:= X *TEN + FLOAT(CH -^0);
end; \ADDIN
begin \RLIN
TEN:= FLOAT(10);
NEG:= false;
loop begin
GETCH; \Ignore any leading garbage
if CH =^- then NEG:= not NEG;
if DIGIT then
begin
X:= FLOAT(CH -^0);
loop begin
GETCH;
if not DIGIT then quit;
ADDIN;
end;
quit;
end;
if CH=^. then [X:= FLOAT(0); quit];
end;
EX:= 0;
if CH = ^. then
loop begin
GETCH;
if not DIGIT then quit;
ADDIN;
EX:= EX -1; \if X gets bigger, the exponent gets smaller
end;
if CH=^E ! CH=^e then
begin
N:=0;
GETCH;
if CH = ^- then [ENEG:= true; GETCH] else ENEG:= false;
if CH = ^+ then GETCH;
while DIGIT do [N:= N *10 +(CH -^0); GETCH];
EX:= EX + (if ENEG then -N else N);
end;
while EX < 0 do [X:= X /TEN; EX:= EX +1];
while EX > 0 do [X:= X *TEN; EX:= EX -1];
return if NEG then -X else X;
end; \RLIN
ile EX < 0 do [X:= X /TEN; EX:= EX +1];
while EX > 0 do [X:= X *TEN; EX:= E